package com.gowants.pems.util;

import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;

import org.apache.ibatis.ognl.Ognl;
import org.apache.ibatis.ognl.OgnlException;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

@SuppressWarnings("rawtypes")
public class JSONList extends ArrayList implements List, Cloneable, Serializable
{

    private static final long serialVersionUID = 1L;

    private JSONArray json = new JSONArray();

    public JSONList()
    {
        json = new JSONArray(10);
    }

    @SuppressWarnings("unchecked")
    public JSONList(List list)
    {
        json = new JSONArray(list);
    }

    public JSONList(int initialCapacity)
    {
        json = new JSONArray(initialCapacity);
    }

    /**
     * 
     * <text解析为JSONList>
     * @param text
     * @return
     * @remake create by GJR 2019年4月26日 下午2:00:42
     */
    public static final JSONList parseJSONList(String text)
    {
        return from(JSONArray.parseArray(text));
    }

    /**
     * <text解析为指定Class类型的List集合>
     * 
     * @param text
     * @param clazz
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:42:23
     * @version 1.0
     */
    public static final <T> List<T> parseList(String text, Class<T> clazz)
    {
        return JSONArray.parseArray(text, clazz);
    }

    /**
     * <根据ognl表达式express从text表示的JSONList中解析>
     * 
     * @param text
     * @param express
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:42:35
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public static final <T> T parseExpress(String text, String express)
    {
        try
        {
            Object obj = Ognl.getValue(express, JSONList.parseJSONList(text));
            if (obj instanceof JSONObject)
            {
                return (T) JSONMap.from((JSONObject) obj);
            }

            if (obj instanceof JSONArray)
            {
                return (T) JSONList.from((JSONArray) obj);
            }

            return (T) obj;
        } 
        catch (OgnlException e)
        {
            throw new RuntimeException(e);
        }
    }

    /**
     * <根据ognl表达式express从json集合对象解析>
     * 
     * @param json
     * @param express
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:42:52
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public static final <T> T parseExpress(JSONList json, String express)
    {
        try
        {
            Object obj = Ognl.getValue(express, json);

            if (obj instanceof JSONObject)
            {
                return (T) JSONMap.from((JSONObject) obj);
            }

            if (obj instanceof JSONArray)
            {
                return (T) JSONList.from((JSONArray) obj);
            }

            return (T) obj;
        } 
        catch (OgnlException e)
        {
            throw new RuntimeException(e);
        }
    }

    /**
     * <复杂的数组字符串 转为List类型>
     * 
     * @param text
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:01
     * @version 1.0
     */
    public static List parseComplexJSONList(String text)
    {
        JSONList jsonList = JSONList.parseJSONList(text);
        return parseComplexJSONList(jsonList);
    }

    /**
     * <复杂的JSONList转为List>
     * 
     * @param jsonList
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:10
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public static List parseComplexJSONList(JSONList jsonList)
    {
        List result = new ArrayList();

        for (int i = 0, size = jsonList.size(); i < size; i++)
        {
            Object item = jsonList.get(i);

            if (item instanceof JSONArray)
            {
                result.add(parseComplexJSONList(from((JSONArray) item)));
                continue;
            }

            if (item instanceof JSONObject)
            {
                result.add(JSONMap.parseComplexJSONMap(JSONMap.from((JSONObject) item)));
                continue;
            }

            result.add(item);
        }

        return result;
    }

    /**
     * <将对象转为JSON字符串>
     * 
     * @param object
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:19
     * @version 1.0
     */
    public static final String toJSONString(Object object)
    {
        return JSONArray.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * <将fastjson中的JSONArray对象转为JSONList对象>
     * 
     * @param array
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:33
     * @version 1.0
     */
    public static JSONList from(JSONArray array)
    {
        if (null == array)
        {
            return null;
        }

        JSONList jsonList = new JSONList();
        jsonList.json = array;
        return jsonList;
    }

    /**
     * <根据Ognl表达式获取对应的Value值>
     * 
     * @param express
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:43
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public <T> T getValue(String express)
    {
        try
        {
            Object obj = Ognl.getValue(express, this);
            if (obj instanceof JSONObject)
            {
                return (T) JSONMap.from((JSONObject) obj);
            }

            if (obj instanceof JSONArray)
            {
                return (T) JSONList.from((JSONArray) obj);
            }
            return (T) obj;
        } 
        catch (OgnlException e)
        {
            throw new RuntimeException(e);
        }
    }

    /**
     * <将列表中指定位置的值转为JSONMap返回>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:43:55
     * @version 1.0
     */
    public JSONMap getJSONMap(int index)
    {
        return JSONMap.from(json.getJSONObject(index));
    }

    /**
     * < 将列表中指定位置的值转为JSONList返回>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:02
     * @version 1.0
     */
    public JSONList getJSONList(int index)
    {
        return JSONList.from(json.getJSONArray(index));
    }

    /**
     * <将列表中指定位置的值转为JSONObject返回>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:09
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public JSONMap getCanModifyJSONMap(int index)
    {
        Object obj = json.get(index);

        if (obj instanceof JSONObject)
        {
            return JSONMap.from(json.getJSONObject(index));
        }

        if (obj instanceof Map)
        {
            return JSONMap.from(new JSONObject((Map) obj));
        }
        throw new RuntimeException("getJSONMap获取失败，内部非JSONObject或Map类型！");
    }

    /**
     * <将指定位置的值转为JSONList返回>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:17
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public JSONList getCanModifyJSONList(int index)
    {
        Object obj = json.get(index);

        if (obj instanceof JSONArray)
        {
            return JSONList.from(json.getJSONArray(index));
        }

        if (obj instanceof List)
        {
            return JSONList.from(new JSONArray((List) obj));
        }

        throw new RuntimeException("getJSONList获取失败，内部非JSONArray或List类型");
    }

    /**
     * <将列表中指定位置的值转为指定Class类型>
     * 
     * @param index
     * @param clazz
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:25
     * @version 1.0
     */
    public <T> T getObject(int index, Class<T> clazz)
    {
        return json.getObject(index, clazz);
    }

    @Override
    public int size()
    {
        return json.size();
    }

    /**
     * <将列表中指定位置的值转为boolean类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:33
     * @version 1.0
     */
    public boolean getBooleanValue(int index)
    {
        return json.getBooleanValue(index);
    }

    /**
     * <将列表中指定位置的值转为Byte类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:41
     * @version 1.0
     */
    public Byte getByte(int index)
    {
        return json.getByte(index);
    }

    /**
     * <将列表中指定位置的值转为Byte类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:49
     * @version 1.0
     */
    public byte getByteValue(int index)
    {
        return json.getByteValue(index);
    }

    /**
     * <将列表中指定位置的值转为Short类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:44:57
     * @version 1.0
     */
    public Short getShort(int index)
    {
        return json.getShort(index);
    }

    /**
     * <将列表中指定位置的值转为Short类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:45:04
     * @version 1.0
     */
    public short getShortValue(int index)
    {
        return json.getShortValue(index);
    }

    /**
     * 
     * <将列表中指定位置的值转为Integer类型>
     * @param index
     * @return
     * @remake create by GJR 2019年4月26日 下午2:03:23
     */
    public Integer getInteger(int index)
    {
        return json.getInteger(index);
    }

    /**
     * 
     * <将列表中指定位置的值转为int类型>
     * @param index
     * @return
     * @remake create by GJR 2019年4月26日 下午2:01:19
     */
    public int getIntValue(int index)
    {
        return json.getIntValue(index);
    }

    /**
     * <将列表中指定位置的值转为Long类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:45:32
     * @version 1.0
     */
    public Long getLong(int index)
    {
        return json.getLong(index);
    }

    /**
     * <将列表中指定位置的值转为long类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:45:47
     * @version 1.0
     */
    public long getLongValue(int index)
    {
        return json.getLongValue(index);
    }

    /**
     * < 将列表中指定位置的值转为float类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:46:00
     * @version 1.0
     */
    public Float getFloat(int index)
    {
        return json.getFloat(index);
    }

    /**
     * <将列表中指定位置的值转为float类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:46:09
     * @version 1.0
     */
    public float getFloatValue(int index)
    {
        return json.getFloatValue(index);
    }

    /**
     * <将列表中指定位置的值转为Double类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:47:54
     * @version 1.0
     */
    public Double getDouble(int index)
    {
        return json.getDouble(index);
    }

    /**
     * 将列表中指定位置的值转为double类型
     * 
     * @param index
     * @return
     */
    public double getDoubleValue(int index)
    {
        return json.getDoubleValue(index);
    }

    /**
     * <将列表中指定位置的值转为BigDecimal类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:47:43
     * @version 1.0
     */
    public BigDecimal getBigDecimal(int index)
    {
        return json.getBigDecimal(index);
    }

    /**
     * <将列表中指定位置的值转为BigInteger类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:47:33
     * @version 1.0
     */
    public BigInteger getBigInteger(int index)
    {
        return json.getBigInteger(index);
    }

    /**
     * <将列表中指定位置的值转为Double类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:47:22
     * @version 1.0
     */
    public String getString(int index)
    {
        return json.getString(index);
    }

    /**
     * <将列表中指定位置的值转为java.util.Date类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:47:13
     * @version 1.0
     */
    public java.util.Date getDate(int index)
    {
        return json.getDate(index);
    }

    /**
     * <将列表中指定位置的值转为java.sql.Date类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:46:51
     * @version 1.0
     */
    public java.sql.Date getSqlDate(int index)
    {
        return json.getSqlDate(index);
    }

    /**
     * <将列表中指定位置的值转为java.sql.Timestamp类型>
     * 
     * @param index
     * @return
     * @Exception
     * @author guanjingrui 2018年12月24日 上午1:46:42
     * @version 1.0
     */
    public java.sql.Timestamp getTimestamp(int index)
    {
        return json.getTimestamp(index);
    }

    /**
     * <将自己转为JSON字符串>
     */
    public String toJSONString()
    {
        return toJSONString(json);
    }

    /**
     * <将自己转为JSON字符串>
     */
    @Override
    public String toString()
    {
        return toJSONString(json);
    }

    @Override
    public boolean isEmpty()
    {
        return json.isEmpty();
    }

    @Override
    public boolean contains(Object o)
    {
        return json.contains(o);
    }

    @Override
    public Iterator iterator()
    {
        return json.iterator();
    }

    @Override
    public Object[] toArray()
    {
        return json.toArray();
    }

    @Override
    public Object[] toArray(Object[] a)
    {
        return json.toArray(a);
    }

    @Override
    public boolean add(Object e)
    {
        return json.add(e);
    }

    @Override
    public boolean remove(Object o)
    {
        return json.remove(o);
    }

    @Override
    public boolean containsAll(Collection c)
    {
        return json.containsAll(c);
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean addAll(Collection c)
    {
        return json.addAll(c);
    }

    @SuppressWarnings("unchecked")
    @Override
    public boolean addAll(int index, Collection c)
    {
        return json.addAll(index, c);
    }

    @Override
    public boolean removeAll(Collection c)
    {
        return json.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection c)
    {
        return json.retainAll(c);
    }

    @Override
    public void clear()
    {
        json.clear();
    }

    @Override
    public Object get(int index)
    {
        return json.get(index);
    }

    @Override
    public Object set(int index, Object element)
    {
        return json.set(index, element);
    }

    @Override
    public void add(int index, Object element)
    {
        json.add(index, element);
    }

    @Override
    public Object remove(int index)
    {
        return json.remove(index);
    }

    @Override
    public int indexOf(Object o)
    {
        return json.indexOf(o);
    }

    @Override
    public int lastIndexOf(Object o)
    {
        return json.lastIndexOf(o);
    }

    @Override
    public ListIterator listIterator()
    {
        return json.listIterator();
    }

    @Override
    public ListIterator listIterator(int index)
    {
        return json.listIterator(index);
    }

    @Override
    public List subList(int fromIndex, int toIndex)
    {
        return json.subList(fromIndex, toIndex);
    }

    /**
     * <截取集合， 返回一个新得集合>
     *
     * @param list 被截取集合， begin 开始位置  count 截取数量
     * @return
     * @remake create by GJR 2019/6/18 14:40
     */
    public static JSONList splitList(int begin, int count, JSONList list)
    {
        JSONList result = new JSONList();

        if(begin + count >= list.size())
        {
            return list;
        }

        for(int i = begin; i < begin + count; i++)
        {
            result.add(list.get(i));
        }

        return result;
    }
}

